//package cn.deschen.search.index;
//
//import java.util.HashSet;
//import java.util.Map;
//import java.util.Set;
//
///**
// * @Author hanbin_chen
// * @Description 多对多表索引通用方法接口, 仅限于主键类型是同一种
// * @DateTime 2021/6/14
// * @Version V1.0.0
// */
//public abstract class Many2ManyIndexAware<K, KA, KB, V extends IndexObject> extends IndexAware<K, V> {
//
//
//    /**
//     * 多对多关系：A -> B主键id集合
//     */
//    private Map<KA, Set<KB>> A2BsMap;
//
//    /**
//     * 多对多关系：B -> A主键id集合
//     */
//    private Map<KB, Set<KA>> B2AsMap;
//
//    public Many2ManyIndexAware(Map<K, V> storageMap, Map<KA, Set<KB>> a2BsMap, Map<KB, Set<KA>> b2AsMap) {
//        super(storageMap);
//        this.A2BsMap = a2BsMap;
//        this.B2AsMap = b2AsMap;
//    }
//
//    public Map<KA, Set<KB>> getA2BsMap() {
//        return A2BsMap;
//    }
//
//    public Map<KB, Set<KA>> getB2AsMap() {
//        return B2AsMap;
//    }
//
//    /**
//     * AB关联索引-新增操作
//     * A一对多B索引-新增操作
//     *
//     * @param key AB关联表主键
//     * @param value AB关联表值
//     */
//    @Override
//    public void add(K key, V value) {
//        update(key, value);
//    }
//
//    /**
//     * AB关联索引-更新操作
//     * A一对多B索引-更新操作
//     *
//     * @param key AB关联表主键
//     * @param value AB关联表值
//     */
//    @Override
//    public void update(K key, V value) {
//        Map<K, V> storageMap = getCache();
//        V oldValue = storageMap.get(key);
//        if (null == oldValue) {
//            storageMap.put(key, value);
//            addAB(getAId(value), getBId(value));
//        } else {
//            if (!getAId(oldValue).equals(getAId(value))
//                    || !getBId(oldValue).equals(getBId(value))) {
//                deleteAB(getAId(oldValue), getBId(oldValue));
//                addAB(getAId(value), getBId(value));
//            }
//            oldValue.update(value);
//        }
//    }
//
//    @Override
//    public void delete(K key) {
//        V value = get(key);
//        if (null == value) {
//            return;
//        }
//        deleteAB(getAId(value), getBId(value));
//        Map<K, V> storageMap = getCache();
//        storageMap.remove(key);
//    }
//
//    /**
//     * A一对多B索引-删除操作
//     *
//     * @param aId A表主键
//     * @param bId B表主键
//     */
//    private void deleteAB(KA aId, KB bId) {
//        Set<KB> bIds = A2BsMap.get(aId);
//        if (null == bIds) {
//            return;
//        }
//        bIds.remove(bId);
//    }
//
//    /**
//     * A一对多B索引-新增操作
//     *
//     * @param aId A表主键
//     * @param bId B表主键
//     */
//    public void addAB(KA aId, KB bId) {
//        Set<KB> bIds = A2BsMap.get(aId);
//        if (null == bIds) {
//            bIds = new HashSet<>();
//            bIds.add(bId);
//            A2BsMap.put(aId, bIds);
//        } else {
//            bIds.add(bId);
//        }
//    }
//
//    /**
//     * AB关联表，A表主键
//     * @param value
//     * @return
//     */
//    public abstract KA getAId(V value);
//
//
//    /**
//     * AB关联表，B表主键
//     * @param value
//     * @return
//     */
//    public abstract KB getBId(V value);
//}
